package fr.utbm.tx52.stamp.logic.algorithm;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import org.apache.commons.collections.comparators.ReverseComparator;

/**
 * *
 *
 * Classe publique qui permet de d�finir des m�thodes de tris de fichiers. Les
 * fichiers peuvent �tre tri�s en fonction : D'un type : par date ou par ville ;
 * D'un ordre : de mani�re croissante ou d�croissante.
 *
 * @author Julien GONZALVES (julien.gonzalves@utbm.fr) Laurent RUBY
 * (laurent.ruby@utbm.fr)
 *
 */
public class SortAlgorithms {

	//Attribut priv� permettant de stocker dans une liste l'ensemble des fichiers contenant des images stock�es sur un p�riph�rique
	private ArrayList<File> files;

	/**
	 * *
	 * Constructeur personnalis� permettant d'initiliser la liste de fichiers �
	 * partir d'une liste de fichiers pass� en param�tre.
	 *
	 * @param _files Liste de fichiers contenant des images.
	 */
	public SortAlgorithms(ArrayList<File> _files) {
		init(_files);
	}

	/**
	 * *
	 * Proc�dure priv�e permettant d'initiliser la liste de fichiers
	 *
	 * @param _files Liste de fichiers contenant des images.
	 */
	private void init(ArrayList<File> _files) {
		files = _files;
	}

	/**
	 * *
	 * Fonction publique permettant de trier la liste de fichiers courante par
	 * date de mani�re croissante ou d�croissante. L'ordre de tri est d�termin�
	 * en fonction du param�tre bool�en pass� en param�tre.
	 *
	 * @param _sortASC Correspond � l'ordre de tri True s'il s'agit d'un tri
	 * croissant par date. C'est-�-dire de la date la plus ancienne � la plus
	 * r�cente. False s'il s'agit d'un tri d�croissant par date. C'est-�-dire de
	 * la date la plus r�cente � la plus ancienne.
	 *
	 * @return La liste de fichiers courante tri�e par date de mani�re
	 * croissante ou d�croissante L'ordre de tri d�pend de la valeur du
	 * param�tre _sortASC
	 */
	@SuppressWarnings("unchecked")
	public ArrayList<File> sortByDate(boolean _sortASC) {

		//S'il s'agit d'une demande de tri croissant par date
		//Alors on r�alise un tri croissant des fichiers en utilisant le comparateur personnalis� "DateComparator".
		if (_sortASC == true) {
			Collections.sort(files, new DateComparator());
		}

		//S'il s'agit d'une demande de tri d�croissant par date
		//Alors on r�alise un tri d�croissant des fichiers en utilisant le comparateur inverse du comparateur personnalis� "DateComparator".
		//Cela permet d'inverser le comportement du comparateur personnalis� DateComparator afin d'obtenir l'inverse d'un tri croissant par date.
		if (_sortASC == false) {
			Collections.sort(files, new ReverseComparator(new DateComparator()));
		}

		return files;
	}

	/**
	 * *
	 * Fonction publique permettant de trier la liste de fichiers courante par
	 * ville de mani�re croissante ou d�croissante. L'ordre de tri est d�termin�
	 * en fonction du param�tre bool�en pass� en param�tre.
	 *
	 * @param _sortASC Correspond � l'ordre de tri True s'il s'agit d'un tri
	 * croissant par ville. C'est-�-dire d'un classement alphab�tique de A � Z.
	 * False s'il s'agit d'un tri d�croissant par date. C'est-�-dire d'un
	 * classement alphab�tique inverse de Z � A.
	 *
	 * @return La liste de fichiers courante tri�e par ville de mani�re
	 * croissante ou d�croissante L'ordre de tri d�pend de la valeur du
	 * param�tre _sortASC
	 */
	@SuppressWarnings("unchecked")
	public ArrayList<File> sortByCity(boolean _sortASC) {

		//S'il s'agit d'une demande de tri croissant par ville
		//Alors on r�alise un tri croissant des fichiers en utilisant le comparateur personnalis� "CityComparator".
		if (_sortASC == true) {
			Collections.sort(files, new CityComparator());
		}

		//S'il s'agit d'une demande de tri d�croissant par ville
		//Alors on r�alise un tri d�croissant des fichiers en utilisant le comparateur inverse du comparateur personnalis� "CityComparator".
		//Cela permet d'inverser le comportement du comparateur personnalis� CityComparator afin d'obtenir l'inverse d'un tri croissant par ville.

		if (_sortASC == false) {
			Collections.sort(files, new ReverseComparator(new CityComparator()));
		}

		return files;
	}
}
